本文章的內容僅限學術及研究用途,請勿進行任何違法行為,否則後果自負。
要使用這種破解手法,你需要擁有一張合法的卡片、一個可以攔截通訊內容的裝置 (Proxmark3),並且要能夠讓讀卡機與卡片進行通訊。這種手法是透過攔截讀卡機與卡片之間的通訊資料,然後透過分析資料並進行 MFKey64 攻擊來還原金鑰。
首先,你需要把 Proxmark3 連接到電腦上,然後透過 pm3 (Proxmark3 冰人版所提供的命令列工具) 來執行以下的指令:
hf 14a sniff
這個指令的執行結果如下:
然後你需要把 Proxmark3 放在讀卡機與合法的卡片之間,然後讓讀卡機與卡片進行通訊,示意圖如下:
在此均民以變色龍來模擬讀卡機,請執行以下程式碼執行讀卡指令:
// 在測試網頁的開發者工具中執行 https://taichunmin.idv.tw/chameleon-ultra.js/test.html
await (async ultra => {
// 載入需要的常數
const { Buffer, Mf1KeyType } = await import('https://cdn.jsdelivr.net/npm/chameleon-ultra.js@0/+esm')
const key = Buffer.from('974C262B9278', 'hex') // 讀卡機用的金鑰
const keyType = Mf1KeyType.KEY_A // 使用金鑰 A
// 讀取一個區塊 (Block)
const block = await ultra.cmdMf1ReadBlock({ block: 0, key, keyType })
// 將讀取到的結果以 HEX 格式顯示
const bufToHex = buf => buf?.toString('hex').toUpperCase()
console.log(`讀取到的區塊內容為:${bufToHex(block)}`)
})(vm.ultra)
這段程式的執行結果如下:
確認讀卡機讀取成功後,按下 Proxmark3 上面的按鈕來停止攔截通訊資料,然後執行以下指令來顯示攔截到的通訊資料:
trace list -u -t mf
這段程式的執行結果如下:
Src
欄位代表資料的傳送方,Rdr
代表讀卡機,Tag
代表卡片,*
則是由 Proxmark3 所附加的額外訊息。
Data
欄位代表實際傳送的資料內容,資料會以 HEX 格式表示,如果在資料右邊有一個 !
代表這個位元組的校驗位元 (parity bit) 有錯誤,有些攻擊手法會利用校驗位元所透漏的訊息。
除了使用校驗位元驗證資料以外,傳送方還會額外計算資料的 CRC16-A 並附帶在資料後面,讓接收方用來驗證資料的正確性,CRC
欄位代表 CRC16-A 的驗證結果。
Annotation
則是 Proxmark3 對資料解析的可能結果,這欄位可以輔助我們了解資料的內容。
我們可以在執行結果中看到 Proxmark3 已經幫我們把金鑰計算出來了,AUTH-A(0)
代表對區塊 0 的金鑰 A 進行認證,然後 key 974C262B9278
就是它計算出來的金鑰。